// Package dao @author dingrui @since 2021/11/26
package dao

import (
	"github.com/go-xorm/xorm"

	"github.com/bannirui/mini-prize/common"
	"github.com/bannirui/mini-prize/dal/model"
	"github.com/bannirui/mini-prize/datasource"
)

type GiftDao struct {
	engine *xorm.Engine
}

var (
	// 单例
	G_giftDao *GiftDao
)

func init() {
	// 单例赋值
	G_giftDao = &GiftDao{engine: datasource.G_ormEngine}
}

//
//  GetById
//  @Description: 根据id查询
//  @receiver d
//  @param id
//  @return data
//
func (d *GiftDao) GetById(id int) (data *model.Gift) {
	var (
		ok  bool
		err error
	)
	data = &model.Gift{Id: id}
	if ok, err = d.engine.Get(data); err != nil || !ok {
		data.Id = 0
	}
	return
}

//
//  ListAll
//  @Description: 查询所有
//  @receiver d
//  @return dataList
//
func (d *GiftDao) ListAll() (dataList []model.Gift) {
	// 初始化切片
	dataList = make([]model.Gift, 0)
	_ = d.engine.Asc("status").Asc("disp_order").Find(&dataList)
	return
}

//
//  CountAll
//  @Description: 计数
//  @receiver d
//  @return num
//
func (d *GiftDao) CountAll() (num int64) {
	var (
		err error
	)
	if num, err = d.engine.Count(&model.Gift{}); err != nil {
		num = 0
	}
	return
}

//
//  DeleteById
//  @Description: 根据id逻辑删除
//  @receiver d
//  @param id
//  @return err
//
func (d *GiftDao) DeleteById(id int) (err error) {
	var (
		data *model.Gift
	)
	data = &model.Gift{Id: id, Status: 1}
	_, err = d.engine.Id(id).Update(data)
	return
}

//
//  Update
//  @Description: 更新
//  @receiver d
//  @param data
//  @param columns
//  @return error
//
func (d *GiftDao) Update(data *model.Gift, columns []string) (err error) {
	_, err = d.engine.Id(data.Id).MustCols(columns...).Update(data)
	return
}

//
//  InsertOne
//  @Description: 新增
//  @receiver d
//  @param data
//  @return err
//
func (d *GiftDao) InsertOne(data *model.Gift) (err error) {
	_, err = d.engine.Insert(data)
	return
}

//
//  ListAllAvailable
//  @Description: 获取所有当前可以获取的奖品列表
//                奖品数量限定
//                状态正常
//                时间期间内
//                type倒序
//                disp_order升序
//  @receiver d
//  @return dataList
//
func (d *GiftDao) ListAllAvailable() (dataList []model.Gift) {
	var (
		now int
	)
	now = common.NowUnix()
	// 初始化切片
	dataList = make([]model.Gift, 0)
	_ = d.engine.
		Cols("id", "name", "total_cnt", "remain_cnt", "hit_rate",
			"duration_day", "img", "disp_order", "type", "data").
		Desc("type").
		Asc("disp_order").
		Where("total_cnt>=?", 0).    // 有限定的奖品
		Where("status=?", 0).        // 有效的奖品
		Where("begin_time<=?", now). // 时间期内
		Where("end_time>=?", now).   // 时间期内
		Find(&dataList)
	return
}

//
//  IncrRemainCnt
//  @Description: 加库存
//  @receiver d
//  @param id
//  @param num
//  @return int64
//  @return error
//
func (d *GiftDao) IncrRemainCnt(id, num int) (remainCnt int64, err error) {
	remainCnt, err = d.engine.Id(id).
		Incr("remain_cnt", num).
		Update(&model.Gift{Id: id})
	return
}

//
//  DecrLeftNum
//  @Description: 减库存
//  @receiver d
//  @param id
//  @param num
//  @return remainCnt
//  @return err
//
func (d *GiftDao) DecrLeftNum(id, num int) (remainCnt int64, err error) {
	remainCnt, err = d.engine.Id(id).
		Decr("left_num", num).
		Where("left_num>=?", num).
		Update(&model.Gift{Id: id})
	return
}
